package com.demo.homework;

import com.demo.upload.StreamUtils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author gy
 * @date 2022/5/4
 */
public class Homework03Server {
    public static void main(String[] args) throws Exception{
        // 1、监听9999 端口
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务端 在 9999 端口监听，等待客户端下载文件");
        // 2、等待客户端的连接
        Socket socket = serverSocket.accept();
        // 3、读取客户端要求的下载的文件名
        InputStream inputStream = socket.getInputStream();
        // 此处通过 while循环读取，是做了扩展，文件名肯定没有这么长
        byte[] b = new byte[1024];
        int length;
        String downLoadFileName = "";
        while ((length = inputStream.read(b))!= -1){
            downLoadFileName += new String(b,0,length);
        }
        System.out.println("客户端希望读取的文件名为："+ downLoadFileName);

        // 3、服务器上保存两个文件  无名.png 高山流水.png
        // 如果客户下载的是 高山流水，我们就返回该文件，否则一律返回 无名.png

        String resFileName = "";
        if("企鹅".equals(downLoadFileName)){
            resFileName = "20220503-network-study/src/main/resources/qie2.png";
        }else {
            resFileName = "20220503-network-study/src/main/resources/莫兰特.png";
        }

        // 4、创建一个输入流，用于读取服务器的文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(resFileName));

        // 5、使用工具类Stream 将输入流文件 转换为 字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bis);

        // 6、得到socket关联的输出流
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());

        // 7、写入到数据通道，返回给客户端
        bos.write(bytes);
        socket.shutdownOutput();// 非常关键

        // 8、关闭相关的资源
        socket.close();
        bos.close();
        bis.close();
        inputStream.close();
        serverSocket.close();

        System.out.println("服务端正常退出");
    }
}
